/*
 * Copyright (C) 2005-2011 MaNGOS <http://www.getmangos.com/>
 *
 * Copyright (C) 2008-2011 Trinity <http://www.trinitycore.org/>
 *
 * Copyright (C) 2010-2011 ProjectSkyfire <http://www.projectskyfire.org/>
 * 
 * Copyright (C) 2011 ArkCORE <http://www.arkania.net/>
 *
 * This program is free software; you can redistribute it and/or modify
 * under the terms of the GNU General Public License as published by the
 * Free Software Foundation; either version 2 of the License, or (at your
 * option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
 * more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program. If not, see <http://www.gnu.org/licenses/>.
 */

#ifndef ARKCORE_CREATURE_TEXT_MGR_H
#define ARKCORE_CREATURE_TEXT_MGR_H

#include "Creature.h"
#include "SharedDefines.h"

struct CreatureTextEntry {
	uint32 entry;
	uint8 group;
	uint8 id;
	std::string text;
	ChatMsg type;
	Language lang;
	float probability;
	Emote emote;
	uint32 duration;
	uint32 sound;
};

enum TextRange {
	TEXT_RANGE_NORMAL = 0,
	TEXT_RANGE_AREA = 1,
	TEXT_RANGE_ZONE = 2,
	TEXT_RANGE_MAP = 3,
	TEXT_RANGE_WORLD = 4
};

typedef std::vector<CreatureTextEntry> CreatureTextGroup; //texts in a group
typedef UNORDERED_MAP<uint8, CreatureTextGroup> CreatureTextHolder; //groups for a creature by groupid
typedef UNORDERED_MAP<uint32, CreatureTextHolder> CreatureTextMap; //all creatures by entry

//used for handling non-repeatable random texts
typedef std::vector<uint8> CreatureTextRepeatIds;
typedef UNORDERED_MAP<uint8, CreatureTextRepeatIds> CreatureTextRepeatGroup;
typedef UNORDERED_MAP<uint64, CreatureTextRepeatGroup> CreatureTextRepeatMap; //guid based

class CreatureTextMgr {
	friend class ACE_Singleton<CreatureTextMgr, ACE_Null_Mutex> ;
	CreatureTextMgr() {
	}
	;
public:
	~CreatureTextMgr() {
	}
	;
	void LoadCreatureTexts();
	CreatureTextMap const& GetTextMap() const {
		return mTextMap;
	}

	void SendSound(Creature* source, uint32 sound, ChatMsg msgtype, uint64 whisperGuid, TextRange range, Team team, bool gmOnly);
	void SendEmote(Unit* source, uint32 emote);

	//if sent, returns the 'duration' of the text else 0 if error
	uint32 SendChat(Creature* source, uint8 textGroup, uint64 whisperGuid = 0, ChatMsg msgType = CHAT_MSG_ADDON, Language language = LANG_ADDON, TextRange range = TEXT_RANGE_NORMAL, uint32 sound = 0, Team team = TEAM_OTHER, bool gmOnly = false, Player* srcPlr = NULL);
	void SendChatString(WorldObject* source, char const* text, ChatMsg msgtype = CHAT_MSG_MONSTER_SAY, Language language = LANG_UNIVERSAL, uint64 whisperGuid = 0, TextRange range = TEXT_RANGE_NORMAL, Team team = TEAM_OTHER, bool gmOnly = false) const;
	bool TextExist(uint32 sourceEntry, uint8 textGroup);
private:
	CreatureTextRepeatIds GetRepeatGroup(Creature* source, uint8 textGroup);
	void SetRepeatId(Creature* source, uint8 textGroup, uint8 id);
	void BuildMonsterChat(WorldPacket* data, WorldObject* source, ChatMsg msgType, char const* text, Language language, uint64 whisperGuid) const;
	void SendChatPacket(WorldPacket* data, WorldObject* source, ChatMsg msgType, uint64 whisperGuid, TextRange range, Team team, bool gmOnly) const;

	CreatureTextMap mTextMap;
	CreatureTextRepeatMap mTextRepeatMap;
};

#define sCreatureTextMgr ACE_Singleton<CreatureTextMgr, ACE_Null_Mutex>::instance()
#endif
